/*
    面向对象的三大特征分别是封装、继承、多态
    一、封装
    1、为什么需要封装：由于外部直接能够访问到类内部的成员变量，导致外部的误操作影响了类中成员的赋值
    2、什么是封装：隐藏类内部成员变量，限制外部直接访问
    3、如何实现封装
    实现步骤
    1）使用private关键字限制外部的访问
    2) 使用set和get存取器来完成私有成员间接访问
    3) 在set或者get方法完成逻辑判断
    4、封装好处
    使用封装可以隐藏代码的实现细节，限制外部的直接访问，增加程序的安全性和可维护性
*/
class Person{
    private _name:string=''
    private _age:number=0
    constructor(n?:string,a?:number){
        this.name=<string>n
        this.age=<number>a
    }
    //set方法在类的内部是方法，在类的外部操作的时候可当成书信
    set name(n:string){
        this._name=n
    }
    get name(){
        return this._name
    }
    set age(a:number){
        if(a<0||a>120){
            throw new Error('年龄不符合要求，年龄要介于0-120岁之间')
        }else{
            this._age=a
        }
    }
    get age(){
        return this._age
    }
    show=()=>`我叫${this._name},今年${this._age}岁`
}
let p1=new Person()
p1.name="黄忠"
try {
    p1.age=-70
} catch (error) {
    p1.age=0
}
console.log(p1.show());
console.log('****************************');

let p2=new Person('马超',23)
console.log(p2.show());



/*
    定义一个书籍类
    书的名称，书的页数
    要求1：书的页数不能小于0，小于0要抛出异常，并且处理异常，使用封装的思想来完成
    要求2：该类一定要提供set赋值和构造赋值两种方式，构造函数要求对页数的限制判断
*/


